package com.dao;

import java.util.List;

import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Root;

import com.model.ItemVenda;
import com.model.Produto;
import com.model.Venda;

public class VendaDao extends GenericDAO<Venda> {

	private static final long serialVersionUID = 1L;

	public VendaDao() {
		super(Venda.class);
	}

	public void delete(Venda venda) {
        	super.delete(venda.getIdVenda(), Venda.class);
	}
	
	public Venda findByPrimaryKey(Venda venda) {
		Query query = em.createQuery("SELECT v FROM Venda v WHERE v = :venda", Venda.class);
		query.setParameter("venda", venda);
		List<Venda> vendas = query.getResultList();
		Venda vendaAux = new Venda();
		venda = vendas.get(0);
		return venda;
	}
	
	//Teacher = venda
	//ClassSection = itemVenda
	//School = produto
	
	public List<Venda> findByProduto(Venda venda, Produto produto) {
		CriteriaBuilder builder  = em.getCriteriaBuilder();
		CriteriaQuery<Venda> query = builder.createQuery(Venda.class);        
		Root<Venda> fromVenda = query.from(Venda.class);
		Root<ItemVenda> fromItemVenda = query.from(ItemVenda.class);		 
		Join<ItemVenda, Venda> vendaJoin = fromItemVenda.join("venda");
		Join<ItemVenda, Produto> produtoJoin = fromItemVenda.join("produto");		 
		TypedQuery<Venda> typedQuery =  em.createQuery(query
		    .select(fromVenda)
		    .where(builder.and(
		            builder.equal(fromVenda, vendaJoin), 
		            builder.equal(produtoJoin.get("idProduto"), produto.getIdProduto())
		    ))
		    .distinct(true)
		);
		 
		List<Venda> vendas = typedQuery.getResultList();
		return vendas;
	}
	
}
